package com.atguigu.gmall.product.service;


import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.model.product.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 分类与属性管理service接口类
 */
public interface ManageService {

    /**
     * 查询所有一级分类列表
     * @return
     */
    public List<BaseCategory1> getCategory1List();

    /**
     * 根据一级分类查询二级分类列表
     * @param category1Id
     * @return
     */
    public List<BaseCategory2> getCategory2List(Long category1Id);

    /**
     * 根据二级分类查询三级分类列表
     * @param category2Id
     * @return
     */
    public List<BaseCategory3> getCategory3List(Long category2Id);

    /**
     * 根据分类查询所有规格信息列表:查询1 2 3级分类对应的规格信息列表,若只查询某一个分类下的规格列表则其他分类的值传0
     * @param category1Id
     * @param category2Id
     * @param category3Id
     * @return
     */
    public List<BaseAttrInfo> getBaseAttrInfoList(Long category1Id, Long category2Id, Long category3Id);

    /**
     * 新增规格
     * @param baseAttrInfo
     * @return
     */
    public BaseAttrInfo saveAttrInfo(BaseAttrInfo baseAttrInfo);

    /**
     * 通过平台属性id查询平台属性值的列表信息
     * @param id
     * @return
     */
    public List<BaseAttrValue> getValueById(Long id);

    /**
     * 分页查询SpuInfo的信息
     * @param category3Id
     * @param page
     * @param size
     * @return
     */
    public IPage<SpuInfo> getSpuInfoList(Long category3Id,Integer page,Integer size);

    /**
     * 分页查询品牌信息
     * @param page
     * @param size
     * @return
     */
    public IPage<BaseTrademark> getTrademarkList(Integer page,Integer size);
    /**
     * 查询所有销售属性信息
     * @return
     */
    public List<BaseSaleAttr> getBaseSaleAttr();
    /**
     * 查询所有品牌信息
     * @return
     */
    public List<BaseTrademark> getTrademark();

    /**
     * 新增品牌
     * @param baseTrademark
     */
    public void addTrademark(BaseTrademark baseTrademark);

    /**
     * 修改品牌
     * @param baseTrademark
     */
    public void updateTrademark(BaseTrademark baseTrademark);

    /**
     * 根据Id查询品牌
     * @param id
     * @return
     */
    public BaseTrademark getTrademarkById(Long id);

    /**
     * 删除品牌
     * @param id
     */
    public void deleteTrademarkById(Long id);
    /**
     * 保存spu
     * @param spuInfo
     */
    public SpuInfo saveSpuInfo(SpuInfo spuInfo);

    /**
     * 查询spu的图片列表
     * @param spuId
     * @return
     */
    public List<SpuImage> getSpuImageList(Long spuId);

    /**
     * 查询销售属性列表
     * @param spuId
     * @return
     */
    public List<SpuSaleAttr> getSpuSaleAttrList(Long spuId);

    /**
     * 保存sku信息
     * @param skuInfo
     * @return
     */
    public SkuInfo saveSkuInfo(SkuInfo skuInfo);

    /**
     * 分页查询skuinfo的信息
     * @param page
     * @param size
     * @return
     */
    public IPage<SkuInfo> getSkuInfoList(Integer page, Integer size);

    /**
     * sku上/下架
     * @param skuId
     * @param status:1-上架 0-下架
     */
    public SkuInfo UpOrDown(Long skuId,Integer status);

    /**
     * 查询sku的详细信息
     * @param skuId
     * @return
     */
    public SkuInfo getSkuInfo(Long skuId);
    /**
     * 查询sku的详细信息：优先从redis中获取，如果redis中没有查询数据库并将数据缓存到redis中
     * @param skuId
     * @return
     */
    public SkuInfo getSkuByRedis(Long skuId);
    /**
     * 查询sku的详细信息:使用redisson查询
     * @param skuId
     * @return
     */
    public SkuInfo getSkuByRedisson(Long skuId);

    /**
     * 根据第三级分类的id查询所有类别的信息(包含一级 二级 三级分类的完整的id和name属性)
     * @param category3Id
     * @return
     */
    public BaseCategoryView getCategoryViewByCategory3Id(Long category3Id);

    /**
     * 获取sku价格
     * @param skuId
     * @return
     */
    public BigDecimal getSkuPrice(Long skuId);

    /**
     * 查询指定商品的销售属性
     * @param skuId
     * @param spuId
     * @return
     */
    public List<SpuSaleAttr> getSpuSaleAttrListCheckBySku(Long skuId, Long spuId);

    /**
     * 查询指定spu的所有销售属性值与sku对应关系
     * @param spuId
     * @return
     */
    public Map getSkuValueIdsMap(Long spuId);

    /**
     * 获取全部分类信息
     * @return
     */
    List<JSONObject> getBaseCategoryList();

    /**
     * 查询品牌信息详情
     * @param id
     * @return
     */
    public BaseTrademark getById(Long id);
    /**根据sku的id查询平台属性信息
     *
     * @param skuId
     */
    public List<BaseAttrInfo> selectBaseAttrInfoBySku(Long skuId);


    /**
     * 删除库存信息
     * @param id
     * @param num
     * @return
     */
    public int updateSkuStock(Long id, Integer num);

    /**
     * 取消订单库存回滚
     * @param id
     * @param num
     */
    public int updateCancelSkuStock(Long id, Integer num);
}
